#include <string.h>
#include <iostream>
#include <fstream>
using std::cout;
using std::endl;
using std::cin;
using std::fstream;
using std::ofstream;
using std::ifstream;

//文件输出流
//使用方式和文件输入流的方式是一致的，构造函数的参数类型也是一致的
//方式1：先试用无参构造函数创建一个ofstream对象，后续关联文件
//方式2：直接在构造函数中去关联文件
//和文件输入流不太一样的地方在于不要求文件一定需要存在
//如果文件不存在则创建一个文件
void test(){
    ofstream ofs;
    ofs.open("test.txt");
    //不需要判断文件是否存在
    ofstream ofs2("test.txt");
}

//ofstream的使用也是非常简单的
//直接使用ofs << 运算符来进行处理即可
//使用起来基本上和cout的使用是一致的
void test2(){
    //默认情况下out模式是每次数据都会截断
    //多次运行，得到的结果并不会追加
    //始终是后者会把前者给覆盖
    //如果当前的项目是一个服务器，持续不断地输出日志信息
    //如果是out模式的覆盖， 那么不行
    //对于排查故障基本是没有任何帮助的
    //ofstream ofs("test.txt");
    ofstream ofs("test.txt", std::ios::app);
    ofs << "hello world hello c++" << endl;
    ofs << "hello c++ hello python" << endl;
    ofs.close();
}

//除了使用<< 运算符来进行写数据之外，还可以使用write来进行操作
void test3(){
    ofstream ofs("1.txt", std::ios::app);
    char arr[6] = "hello";
    ofs.write(arr, strlen(arr));
    ofs.close();
}


//文件输入输出的案例
//利用cin来接收用户输入的5个字符，将这5个字符写入文件中
//随后读取文件里面的这5个字符并且加以显示出来
void test4(){
    //定义一个文件输入输出流对象
    //该对象同时兼顾文件的读取和写入操作
    //fstream和ofstream还是有些不太一样
    //如果文件不存在，则并不会生成该文件
    fstream fs("digit.txt");
    //定义了一个int变量，用来去接收用户从键盘的录入行为
    int number;
    for(int i = 0; i < 5; ++i){
        //每次接收一个键盘录入的信息，写入到number中
        cin >> number;
        //fs文件输入输出流对象从number中获取数据，并且写入到文件中
        fs << number << " ";
    }
    fs.flush();
    //开始读取位于digit.txt里面的数据
    //此时压根没有读取到任何一个字符
    //读取不到，主要的原因在于此时文件的游标位于末尾
    //让文件的游标移动到文件的开头
    fs.seekg(0);
    for(int i = 0; i < 5; ++i){
        fs >> number;
        cout << number << " ";
    }
    cout << endl;
}

//设置文件的游标以及获取文件的游标
//tellg获取
//seekg设置游标：两种使用形式
//1.传入一个数值，该数值表示的是一个绝对位置
//2.传入一个数值和一个相对的基准位置，表示的是相对基准位于的偏移量
//如果定位到文件的开始，上述两种方式均可以
//如果文件定位到末尾，使用2更为方便一些

//依然是完成上述的test4的案例
//用户录入5个数字，将录入的这5个数字写入到文件中
//随后读取该数字，并且正确显示
void test5(){
    ofstream ofs("digit2.txt");
    int number;
    for(int i = 0; i < 5; ++i){
        cin >> number;
        ofs << number << " ";
    }
    ofs.close();
    ifstream ifs("digit2.txt");
    for(int i = 0; i < 5; ++i){
        ifs >> number;
        cout << number << " ";
    }
    cout << endl;
}


int main()
{
    test5();
    return 0;
}

